#ifndef DATAMEDIA_H
#define DATAMEDIA_H

#include "datamediadefine.h"
#include "datamediasafety.h"
#include <QThread>
#include "singleton.h"

/**
 * 1、数据保存需要在一个独立线程运行，读取不需要，因为只在启动时读一次即可，以后数据修改完都在内存里，最后才往flash保存
 *      这样可以不使用互斥锁/读写锁
 * 2、数据保存需要实现可靠保存，即顺序保存2份，不同时刻至少有一份数据是完整的，
 *      如果一份数据在保存过程中断电导致数据丢失，通过另一份可实现数据恢复
 * 3、对于输注泵AM335文件系统，数据保存时先保存到/tmp/目录下，因为该系统的/tmp目录是ramdisk文件系统，IO操作快，再保存到flash
 */

class DataMedia : public QObject
{
    Q_OBJECT
    SINGLETON_DECLARE(DataMedia)
public:
    DataMedia(QObject *parent = nullptr);
    ~DataMedia();

    bool load(const QString &fileName, QByteArray &data) const;
    bool save(const QString &fileName, QByteArray &data);

signals:
    bool async_save(const QString fileName, QByteArray data);

private:
    bool restore(const QString &fileName);

    DataMediaSafety         *m_safety;
    QThread                 *m_thread;
};

#define dataMedia DataMedia::getInstance()

#endif // DATAMEDIA_H
